package com.janko.springbootbase.controller.unitvolatile;

/**
 * @ClassName VolatileDisorder
 * @Description volatile的指令重排 用反证法来证明指令会重排 即：后边的线程先跑
 * @Author janko
 * @Date 2020/12/4 14:55
 */
public class VolatileDisorder {
    /**
     * 测试 volatile指令重拍的概念
     */
    private static  int x=0,y=0;
    private static  int a=0,b=0;
    //反证法   反过来证明CPU不是乱序的
    public static void main(String[] args) throws InterruptedException {

        int i =0;
        for(;;){
            i++;
            x=0;y=0;
            a=0;b=0;
            Thread one =new Thread(new Runnable() {
                @Override
                public void run() {
                    //由于线程one先启动，下面这句话让它等一等two线程、可根据自己的电脑设置等待的时间
                    //shortWait(1000);
                    a = 1;
                    x = b;
                }
            });
            Thread other = new Thread(new Runnable() {
                @Override
                public void run() {
                    b = 1;
                    y = a;
                }
            });
            one.start();other.start();
            one.join();other.join(); //join() 是主线程等待子线程的终止。
            String result = "第" + i + "次(" + x + "," + y + ")";
            if (x == 0 && y == 0) {//如果x=0,y=0 那么就会出现CPU乱序
                // 因为other 线程先执行的话 那么x=0,y=0
                System.out.println(result);
                break;
            } else {
            }
        }
    }
}
